/***********************************************************************
 * 描述:		此文件中包含多个类和枚举
 *			FtcResultFlag:文件接口调用结果枚举
 *			FtcUploadFileInfo:文件上传信息
 *			FtcDownloadFileInfo:文件下载信息
 *			FtcDownloadImageInfo:图像下载信息
 *			Ftc:该类是文件上传与下载类。
 * File:    ftc.h
 * Author:  liquan@mozihealthcare.cn
 * Date:    2025-10-13
 * Update:
 **********************************************************************/

#ifndef FTC_H
#define FTC_H

#include "ftc/export.h"
#include <QImage>
#include <iostream>

class FileInfo;

/**
 * 文件接口调用结果枚举
 */
enum class CXI_FTC_EXPORT FtcResultFlag
{
	/**
	 * 发生异常
	 */
	Exception = -99,
	/**
	 * 成功
	 */
	Success = 0,
	/**
	 * 失败
	 */
	Fail = 10001,
	/**
	 * 系统内部异常
	 */
	ServiceException = 10002,
	/**
	 * 请求参数不合法
	 */
	InvalidParameters = 10003,
	/**
	 * 请求参数为空
	 */
	ParameterEmptyError = 10004,
	/**
	 * 业务逻辑错误
	 */
	ServiceLogicError = 10005,
	/**
	 * 网络异常
	 */
	NetworkAnomaly = 10101
};

/**
 * 文件上传信息
 */
struct CXI_FTC_EXPORT FtcUploadFileInfo
{
	//设置友元类
	friend class Ftc;

	/**
	 * 获取结果标识
	 * @return 结果标识
	 */
	FtcResultFlag flag() const;
	/**
	 * 获取文件上传成功后的ID
	 * @return 文件上传成功后的ID
	 */
	QString newFileId() const;
	/**
	 * 获取旧文件ID
	 * @return 旧文件ID
	 */
	QString oldFileId() const;
	/**
	 * 获取错误信息
	 * @return 错误信息
	 */
	QString errMsg() const;

private:
	void setFlag(FtcResultFlag flagInfo);
	void setNewFileId(const QString& fileId);
	void setOldFileId(const QString& fileId);
	void setErrMsg(const QString& msg);

	FtcResultFlag m_flag = FtcResultFlag::Fail;
	QString m_newFileId;
	QString m_oldFileId;
	QString m_errMsg;
};

/**
 * 文件下载信息
 */
struct CXI_FTC_EXPORT FtcDownloadFileInfo
{
	//设置友元类
	friend class Ftc;

	/**
	 * 获取结果标识
	 * @return 结果标识
	 */
	FtcResultFlag flag() const;
	/**
	 * 获取错误信息
	 * @return 错误信息
	 */
	QString errMsg() const;

private:
	void setFlag(FtcResultFlag flagInfo);
	void setErrMsg(const QString& errMsg);

	FtcResultFlag m_flag = FtcResultFlag::Fail;
	QString m_errMsg;
};

/**
 * 图像下载信息
 */
struct CXI_FTC_EXPORT FtcDownloadImageInfo
{
	//设置友元类
	friend class Ftc;

	/**
	 * 获取结果标识
	 * @return 结果标识
	 */
	FtcResultFlag flag() const;
	/**
	 * 获取下载的图像对象
	 * @return 下载的图像对象
	 */
	QImage image() const;
	/**
	 * 获取错误信息
	 * @return 错误信息
	 */
	QString errMsg() const;

private:
	void setFlag(FtcResultFlag flagInfo);
	void setImage(const QImage& imageObject);
	void setErrMsg(const QString& errMsg);

	FtcResultFlag m_flag = FtcResultFlag::Fail;
	QImage m_image;
	QString m_errMsg;
};

/**
 * 文件上传与下载类
 */
class CXI_FTC_EXPORT Ftc
{
public:
	/**
	 * 设置连接超时时长
	 * @param timeout 连接超时时长(毫秒)
	 */
	static void setConnectTimeout(long timeout);
	/**
	 * 设置总超时时长
	 * @param timeout 总超时时长(毫秒)
	 */
	static void setRequestTimeout(long timeout);
	/**
	 * 设置文件服务根地址
	 * @param rootUrl 文件服务根地址
	 */
	static void setRootUrl(const QString& rootUrl);

	// /**
	//  * 下载文件（会提示保存本地路径选择框）
	//  * @param fileId 待下载的文件Id
	//  * @return 文件下载后的信息
	//  */
	// static FtcDownloadFileInfo downloadFile(const std::string& fileId);
	/**
	 * 下载文件
	 * @param fileId 待下载的文件Id
	 * @param saveFullName 保存本地完整路径
	 * @return 文件下载后的信息
	 */
	static FtcDownloadFileInfo downloadFile(const QString& fileId, const QString& saveFullName);
	/**
	 * 下载文件(自动补齐扩展名)
	 * @param fileId 待下载的文件Id
	 * @param saveFullName 保存本地完整路径(补齐扩展名)
	 * @return 文件下载后的信息
	 */
	static FtcDownloadFileInfo downloadFileAutoExt(const QString& fileId, QString& saveFullName);
	/**
	 * 下载图像
	 * @param fileId 待下载的文件Id
	 * @return 图像信息
	 */
	static FtcDownloadImageInfo downloadImage(const QString& fileId);
	/**
	 * 获取文件的文本内容
	 * @param fileId 待下载的文件Id
	 * @return 文件的文本内容
	 */
	static QString getFileText(const QString& fileId);
	/**
	 * 获取文件的URL
	 * @param fileId 待下载的文件Id
	 * @return 文件的URL
	 */
	static QString getUrl(const QString& fileId);
	/**
	 * 通过URL下载文件
	 * @param url 文件下载地址
	 * @param saveFullName 文件本地保存完整路径
	 * @return 文件下载后的信息
	 */
	static FtcDownloadFileInfo downloadFromUrl(const QString& url, const QString& saveFullName);

private:
	/**
	 * 查询文件信息
	 * @param fileId 文件Id
	 * @return 文件信息
	 */
	static FileInfo queryFileInfo(const QString& fileId);
	/**
	 * 下载文件
	 * @param fileId 文件ID
	 * @param saveFullName 保存本地完整路径
	 * @param autoExt 自动补全扩展名
	 * @return 下载文件结果
	 */
	static FtcDownloadFileInfo downloadFile(const QString& fileId, QString& saveFullName, bool autoExt);
};



#endif //FTC_H
